const express = require('express');
const cors = require('cors');
const Redis = require('ioredis');
const app = express();
const PORT = 3000;

// 创建 Redis 客户端
const redis = new Redis({
    // host: 'localhost', // Redis 服务的地址
    host: 'redis-service', // Redis 服务的地址
    port: 6379,        // Redis 默认端口
});

// 连接成功事件
redis.on('connect', () => {
    console.log('Connected to Redis');
});

// 处理错误事件
redis.on('error', (err) => {
    console.error('Redis error:', err);
});

// 允许跨域
app.use(cors());
// 中间件，解析 JSON 请求体
app.use(express.json());

// SSE 路由
app.get('/api/sse', (req, res) => {
    console.log('GET request received -- /api/sse');
    // 设置 SSE 头部
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');

    // 发送初始消息
    res.write('data: Connected!\n\n');

    // 定时发送数据
    let count = 0;
    const timer = setInterval(() => {
        const data = {
            time: new Date().toISOString(),
            count: count++,
            message: 'Hello from SSE!'
        };
        res.write(`data: ${JSON.stringify(data)}\n\n`); // 必须用 \n\n 结尾
    }, 1000);

    // 客户端断开时清理
    req.on('close', () => {
        clearInterval(timer);
        res.end();
    });
});

// 健康检查端点（用于 Kubernetes）
app.get('/api/health', (req, res) => {
    console.log('GET request received -- /api/health');
    res.status(200).send('OK');
});

// 处理 GET 请求
app.get('/api/test', async (req, res) => {
    console.log('GET request received -- /api/test');
    // res.send('Hello, this is a GET response!');

    try {
        // 等待异步操作完成
        const result = await redis.get(req.query.k ? req.query.k : 'key');
        console.log('Got name:', result);
        // 返回结果
        res.json({ message: result });
    } catch (error) {
        // 处理错误
        console.error('Error:', error);
        res.status(500).json({ error: 'Internal Server Error' });
    }

});

app.listen(PORT, () => {
    console.log(`SSE Server running on http://localhost:${PORT}/api/test`);
});